﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BlackEagleClient.DatingReference;
using System.Web.Services;


namespace BlackEagleClient
{
    public partial class Mailbox : System.Web.UI.Page
    {
        List<DirectMessageComposite> messages;

        protected void Page_Load(object sender, EventArgs e)
        {
            //Kontrollering av att det finns en inloggad användare
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                GetMails();

                //Om sidan har laddats om (postback) så ska det kontrolleras om det finns en querystring (en giltigt int) i url:en
                if (!IsPostBack)
                {

                    int queryId;
                    if (Int32.TryParse(Request.QueryString["id"], out queryId))
                    {
                        //Om det finns en giltigt int i querystring(id) så kallas ShowMail med den int:en
                        ShowMail(queryId);
                    }
                }
                Guid id = new Guid(WebProfile.Current.ID);

                //Kod för hantera/räkna nya vänansökan och nya meddelanden
                using (DatingServiceClient client = new DatingServiceClient())
                {
                    Label msgLabel = (Label)Master.FindControl("loginViewMasterCount").FindControl("lblCountMsg");
                    if (msgLabel != null)
                    {
                        int counter = client.CountNewMessages(id);
                        msgLabel.Text = counter.ToString();
                    }

                    Label friendLabel = (Label)Master.FindControl("loginViewMasterCount").FindControl("lblCountFriend");
                    if (friendLabel != null)
                    {
                        int counter = client.CountNewFriends(id);
                        friendLabel.Text = counter.ToString();
                    }
                }
            }
            else
            {
                //Är besökaren inte inloggad så skickas hen till loginsidan
                Response.Redirect("/account/Login.aspx");
            }
        }

        public void GetMails()
        {
            //En kontroll för inloggad användare (om sessionen för användaren gått ut innan användaren begär att se mail)
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            {
                //Mail ska endast visas för användare med rollen "Premium" och därför görs en kontroll här för att bestämma om användaren är i "Premium" eller inte.
                if (HttpContext.Current.User.IsInRole("Premium")) 
                {
                    using (DatingServiceClient client = new DatingServiceClient())
                    {
                        //Hämta mailen för användaren med metoden GetMessages i WCF:en (ID från WebProfile (nuvarande användaren) görs om till GUID).
                        messages = client.GetMessages(Guid.Parse(WebProfile.Current.ID.ToString()));
                        List<PersonComposite> persons = new List<PersonComposite>();

                        //I nästa steg hämtas information om avsändaren, om det inte finns några meddelanden så genomförs inte nästa steg.
                        if (messages.Count > 0)
                        {
                            //Hämta alla avsändare i form av Person-objekt
                            foreach (var msg in messages)
                            {
                                persons.Add(client.GetProfile(msg.Sender));
                            }

                            //En lista av Objekt, som senare ska fyllas med anonyma objekt/typer
                            List<Object> dms = new List<Object>();

                            Guid id;
                            int i = 0;

                            //För varje meddelande (DirectMessage) så skapas ett anonymt objekt som innehåller; förnamn, efternamn (från Person) samt titel, id och content (från DirectMessage).
                            foreach (var msg in messages)
                            {
                                id = messages[i].Sender;
                                DirectMessageComposite dmc = messages[i];
                                var query = persons.Where(x => x.ID.Equals(id)).Select(x => new { Name = x.Fnamn + " " + x.Enamn, Subject = dmc.Title, ID = dmc.ID, MailContent = dmc.Content }).First();
                                dms.Add(query);
                                i++;
                            }

                            //MailDataList ligger inuti en loginView (för att endast visas för "Premium"-användare) och måste hämtas genom FindControl
                            DataList MailDataList = (DataList)LoginView1.FindControl("MailDataList");

                            //Listan med de anonyma objekt (dms) används för att fylla MailDataList
                            MailDataList.DataSource = dms;
                            MailDataList.DataBind();

                        }
                    }
                }
            }


        }

        public string CreateLink(string id) 
        {
            return "/Mailbox.aspx?id=" + id;
        }

        /// <summary>
        /// Tar emot ett id, som är kopplat till ett DirectMessage.
        /// Hämtar aktuellt DirectMessage och presenterar meddelandets innehåll.
        /// </summary>
        /// <param name="id"></param>
        public void ShowMail(int id)
        {
            try
            {
               //Söker igenom messages (som fylls när sidan laddas) innehållande aktuell användares DirectMessage
                String content = messages.Where(x => x.ID.Equals(id)).Select(x => x.Content).First();
                //Söker efter mailLabel inom LoginView mha FindControl
                var mailLabel = (Label)LoginView1.FindControl("MailContentTxt");
                mailLabel.Text = content;

                //Om meddelandet är markerat som "inte läst" (isRead == false) så ändras det till "läst" (isRead == true)
                if(messages.Where(x => x.ID == id).First().IsRead == false) 
                {
                    MarkMessageAsRead(id);
                }

            }
            catch (Exception)
            {
                //Om inte mailets id är giltigt så laddas sidan om.
                Response.Redirect("Mailbox.aspx");
            } 

        }

        /// <summary>
        /// Kallar på MarkMessageAsRead i WCF:en för att markera ett DirectMessage som "läst" (IsRead == true)
        /// </summary>
        /// <param name="id"></param>
        private void MarkMessageAsRead(int id)
        {
            using(DatingServiceClient client = new DatingServiceClient())
            {
                client.MarkMessageAsRead(id);
            }
        }

        protected void LoginView1_ViewChanged(object sender, EventArgs e)
        {

        }
    }
}